void Swap(int *x, int *y)
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}
// 函数指针
// 函数本身就是一段内存里面的代码，C 语言允许通过指针获取函数。
// 比较特殊的是，C 语言还规定，函数名本身就是指向函数代码的指针，通过函数名就能获取函数地址。也就是说，print和&print是一回事。

// 上面示例中，变量print_ptr是一个函数指针，它指向函数print() 的地址。函数print() 的地址可以用 &print获得。注意，(*print_ptr) 一定要写在圆括号里面，否则函数参数(int) 的优先级高于 *，整个式子就会变成void *print_ptr(int)。
// 有了函数指针，通过它也可以调用函数。
void print(int a)
{
    printf("%d\n", a);
}

void (*print_ptr)(int) = &print;

int main(int argc, char const *argv[])
{
    // 可以通过地址 进行交换值
    int a = 1;
    int b = 2;
    Swap(&a, &b);
    // (*swap_ptr)(&a, &b); // 无效
    printf("a的值是%d\n", a);
    printf("b的值是%d\n", b);
    (*print_ptr)(10); // 打印
    printf("a的值是%d\n", a);
    printf("b的值是%d\n", b);
    return 0;
}
